package com.atguigu.spzx.cart.service.impl;

import com.atguigu.spzx.cart.service.CartService;
import com.atguigu.spzx.common.util.AuthContextUtil;
import com.atguigu.spzx.feign.product.ProductFeignClient;
import com.atguigu.spzx.model.entity.h5.CartInfo;
import com.atguigu.spzx.model.entity.product.ProductSku;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @ClassName: CartServiceImpl
 * @Package: com.atguigu.spzx.cart.service.impl
 * @Description
 * @Author 孤妤
 * @Date: 2023/12/20 10:08
 */
@Service
@Transactional
public class CartServiceImpl implements CartService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private ProductFeignClient productFeignClient;
    private String getCartKey(){
        Long userId = AuthContextUtil.getUserInfo().getId();
        return "user:cart:"+userId;
    }
    @Override
    public void addTocart(Long skuId, Integer skuNum) {
        // 获取用户id
        Long userId = AuthContextUtil.getUserInfo().getId();
        // 获取redis保存的key
        String cartKey = getCartKey();
        // 从redis中查询是否是第一次添加
        CartInfo cartInfo = (CartInfo) redisTemplate.opsForHash().get(cartKey, String.valueOf(skuId));
        if (cartInfo==null){ //为null表示是第一次添加,不为null表示不是第一次添加
            // 新建一个cartInfo对象
            cartInfo = new CartInfo();
            // 获取商品sku对象
            ProductSku productSku = productFeignClient.getBySkuId(skuId);
            cartInfo.setUserId(userId);
            cartInfo.setSkuId(skuId);
            cartInfo.setSkuNum(1);
            cartInfo.setIsChecked(1);
            cartInfo.setSkuName(productSku.getSkuName());
            cartInfo.setCartPrice(productSku.getSalePrice());
            cartInfo.setImgUrl(productSku.getThumbImg());
        }else {
            cartInfo.setSkuNum(cartInfo.getSkuNum()+skuNum);
        }
        redisTemplate.opsForHash().put(cartKey,String.valueOf(skuId),cartInfo);
    }

    @Override
    public List<CartInfo> findCartList() {
        // 获取redis保存的key
        String cartKey = getCartKey();
        // 查询redis中所有的购物车数据
        return redisTemplate.opsForHash().values(cartKey);
    }

    @Override
    public void removeCartBySkuId(Long skuId) {
        // 获取redis中的key
        String cartKey = getCartKey();
        // 根据skuId删除redis中的商品
        redisTemplate.opsForHash().delete(cartKey,String.valueOf(skuId));
    }

    @Override
    public void changeCartIsCheckedBySkuId(Long skuId, Integer isChecked) {
        // 获取redis的key
        String cartKey = getCartKey();
        // redis中获取cartInfo对象
        CartInfo cartInfo = (CartInfo) redisTemplate.opsForHash().get(cartKey,String.valueOf(skuId));
        // 更新cartInfo中的isChecked放入redis中
        cartInfo.setIsChecked(isChecked);
        redisTemplate.opsForHash().put(cartKey,String.valueOf(skuId),cartInfo);
    }

    @Override
    public void changeAllCartIsCheckedBySkuId(Integer isChecked) {
        // 获取redis中的key
        String cartKey = getCartKey();
        // 获取redis中的cartInfo对象列表
        List<CartInfo> cartInfoList = findCartList();
        // 将对象中的isChecked更改为0
        cartInfoList.forEach(item->{
            item.setIsChecked(isChecked);
            redisTemplate.opsForHash().put(cartKey,String.valueOf(item.getSkuId()),item);
        });
    }

    @Override
    public void changeAllCart() {
        // 获取redis中的key
        String cartKey = getCartKey();
        // 删除所有的商品
        redisTemplate.delete(cartKey);
    }

    @Override
    public List<CartInfo> findAllCartIsChecked() {
        // 获取redis中的key
        String cartKey = getCartKey();
        // 获取cartInfo对象列表
        List<CartInfo> cartInfoList = findCartList();
        // 过滤对象中isChecked为1的
        List<CartInfo> isCheckedList = cartInfoList.stream().filter(cartInfo -> cartInfo.getIsChecked() == 1).collect(Collectors.toList());
        return isCheckedList;
    }

    @Override
    public void deleteChecked() {
        changeAllCart();
    }
}
